/*
 * @(#)XfspSeparationIndex.java        2004/08/01
 *
 * This file is part of Xfuzzy 3.1, a design environment for fuzzy logic
 * based systems.
 *
 * (c) 2000 IMSE-CNM. The authors may be contacted by the email address:
 *                    xfuzzy-team@imse.cnm.es
 *
 * Xfuzzy is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation.
 *
 * Xfuzzy is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

package xfuzzy.xfsp.model.types;

/**
 * <p> <b>Descripci�n:</b> clase que calcula el �ndice de separaci�n de Dunn de
 * un conjunto de datos agrupados en <i>clusters</i>.
 * <p> <b>E-mail</b>: <ADDRESS>joragupra@us.es</ADDRRESS>
 * @author Jorge Agudo Praena
 * @version 2.1
 * @see IXfspTypeSimplifier
 * @see IXfspValidityMeasure
 * @see XfspDunnValidityMeasure
 * @see XfspTypeSimplifierFactory
 *
 */
public class XfspSeparationIndex extends XfspDunnValidityMeasure{

/**
 * <p> <b>Descripci�n:</b> crea un medidor del �ndice de separaci�n de Dunn para
 * datos agrupados en clusters.
 * @param data Conjunto de datos que se quieren agrupar en clusters y del que
 * se va a calcular el n�mero �ptimo de ellos.
 * @param weights Pesos asignados a cada uno de los elementos que compone un
 * data de los que se van a estudiar (como hayan sido definidos previamente).
 *
 */
  public XfspSeparationIndex(double [][] data, double [] weights) {
    //llama al constructor de la superclase con los mismos par�metros
    super(data, weights);
  }

  /**
   * <p> <b>Descripci�n:</b> devuelve el valor del numerador para el �ndice de
   * separaci�n.
   * @param data Conjunto de datos agrupables en <i>clusters</i>.
   * @param assign Asignaci�n hecha de los datos a los distintos
   * <i>clusters</i>.
   * @param weights Pesos asignados a los par�metros de las funciones de
   * pertenencia.
   * @param c1 N�mero del primer <i>cluster</i>.
   * @param c2 N�mero del segundo <i>cluster</i>.
   * @return Valoraci�n del numerador del m�todo de validaci�n de Dunn 33.
   *
   */
  protected double getNumerator(double [][] data, int [] assign, double [] weights, int c1, int c2)
  {
    IXfspDistance d=new XfspEuclideanDistance(weights);
    return d.minDistance(data,assign,c1,c2);
  }

  /**
   * <p> <b>Descripci�n:</b> devuelve el valor del denominador para cualquiera
   * de los m�todos de validaci�n de Dunn generalizados.
   * @param data Conjunto de datos agrupables en <i>clusters</i>.
   * @param assign Asignaci�n hecha de los datos a los distintos
   * <i>clusters</i>.
   * @param weights Pesos asignados a los par�metros de las funciones de
   * pertenencia.
   * @param c N�mero del <i>cluster</i>.
   * @return Valoraci�n del denominador de los m�todos de validaci�n de Dunn
   * generalizados.
   *
   */
  protected double getDenominator(double [][] data, int [] assign, double [][] cluster, double [] weights, int c)
  {
    //objeto que permite el c�lculo de distintos tipos de distancias
    IXfspDistance d=new XfspEuclideanDistance(weights);
    //valor del denominador de la funci�n que permite calcular el n�mero �ptimo
    //de clusters
    double result;
    //si se est� proponiendo alguna agrupaci�n en clusters, es decir, el n�mero
    //de clusters es menor que el de funciones de pertenencia original...
    if(cluster.length!=data.length){
      //...devuelve el di�metro del cluster n�mero 'c'
      result = d.diameter(data, assign, c);
    }
    //si no se est� agrupando en clusters, es decir, el n�mero de clusters es
    //igual al de funciones de pertenencia original...
    else{
      //...el di�metro de cualquier cluster dar�a un resultado de 0, ya que
      //todos los clusters estar�an formados por un solo elemento, por lo que,
      //en su lugar, devolvemos un valor razonable que permite continuar con el
      //c�lculo del mejor n�mero de clusters en que agrupar los datos
      result = 0.1;
    }
    return result;
  }
}
